
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>字符串什么时候进入到字符串常量池的？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>字符串什么时候进入到字符串常量池的？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Java中，通过字面值形式（如 `String str = "Hello";`）创建的字符串是如何被处理的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在编译阶段，所有使用字面值形式创建的字符串都会被自动放入字符串常量池中。如果多个变量使用了相同的字符串字面值，JVM会共享常量池中同一个字符串对象，而不会创建多个副本。</div>
          </div>
          <div class="card-source">来源: 1. 编译时字面值创建的字符串</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java中的 `String.intern()` 方法的主要作用是什么？请描述它的工作流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`intern()` 方法用于手动将一个字符串放入字符串常量池。它的工作流程是：首先检查常量池中是否存在内容相同的字符串。如果存在，则返回池中已存在的字符串的引用；如果不存在，则将该字符串添加到常量池中，并返回其在常量池中的引用。</div>
          </div>
          <div class="card-source">来源: 2. 使用 intern() 方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">对于通过 `+` 操作符连接的字符串，什么情况下其结果会被自动放入字符串常量池，什么情况下不会？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当连接的双方都是字符串字面值（常量表达式，如 `"Hello" + "World"`）时，编译器会在编译时计算结果并将其作为新的字符串常量放入常量池。但如果表达式中涉及到变量（如 `str1 + "World"`），计算会在运行时进行，其结果不会自动进入常量池。</div>
          </div>
          <div class="card-source">来源: 3. 字符串常量表达式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">对于一个在堆内存中通过 `new String("Hello")` 创建的字符串对象，如何将其加入字符串常量池？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以调用该字符串对象的 `intern()` 方法。这个方法会检查常量池，如果常量池中不存在内容为 "Hello" 的字符串，它就会被加入常量池，并返回常量池中的引用。</div>
          </div>
          <div class="card-source">来源: 2. 使用 intern() 方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在Java类加载过程中，静态初始化的字符串字面值会如何处理？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在类加载过程中，通过静态初始化块或静态变量定义的字符串字面值（例如 `static String str = "Hello";`）会自动被加入到字符串常量池中。</div>
          </div>
          <div class="card-source">来源: 4. 静态初始化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么当多个变量被赋予相同的字符串字面值时（如 `String s1 = "Hi"; String s2 = "Hi";`），它们会指向同一个对象？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这是因为JVM为了优化性能和节省内存，对字符串字面值采取了共享机制。当编译器遇到字符串字面值时，会将其放入字符串常量池。如果后续遇到相同的字面值，JVM会直接返回池中已存在的对象的引用，而不是创建一个新的对象。</div>
          </div>
          <div class="card-source">来源: 1. 编译时字面值创建的字符串</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
